#include <iostream>
#include <vector>
#include <cassert>

using namespace std;

/**
 * l每次可以向前跳跃, 而不仅仅是+1
 * 但代价是, 为了获得这个跳跃的位置, 每次需要遍历整个窗口的字符串
 * [O(len(s)*len(charset)), O(len(charset)))]	
 */
class Solution{
	public:
		int lengthOfLongestSubstring(string s) {
			int l = 0, r = 0; //滑动窗口为s[l...r]
			int res = 0;

			while(r < s.size()){

				int index = isDuplicateChar(s, l, r);

				// 如果s[r]之前出现过
				// l可以直接跳到s[r+1]之前出现的位置 + 1的地方
				if(index != -1)
					l = index + 1;

				res = max(res, r-l+1);
				r ++;
			}

			return res;
		}
	private:
		// 查看s[l...r-1]之间是否存在s[r]
		// 若存在,返回相应的索引, 否则返回-1
		int isDuplicateChar(const string& s, int l, int r){
			for(int i = l ; i < r ; i ++)
				if(s[i] == s[r])
					return i;
			return -1;
		}
};	
